package com.sxj.corejava.code07_面向对象.抽象类与接口;

/**
 * @author 石小俊
 * @date 2024年03月26日 18:13
 */
public class Test03_接口的特性 {

    public static void main(String[] args) {
        A a = new C();
        a.doSome();
        // 此时A接口的引用指向了实现类的对象
        // 但是在A接口中只有doSome方法,无法直接调用doOther方法
        // 但是可以强制转换成对应实现类来调用
        ((C) a).doOther();
        a.login();

        // 当重写了默认方法之后,调用时执行的一定是重写后的方法
        C c = new C();
        c.login();
    }

}

interface A {
    void doSome();

    /**
     * 在接口中,默认不允许存在普通方法
     * 但是在JDK8中引入了一个新的关键字default
     * 通过default关键字可以定义普通方法
     * 当接口中存在默认实现的方法,在实现接口中,可以选择是否重写该方法
     */
    default void login() {
        System.out.println("正在登陆");
    }
}

interface B {
    void doOther();
}

/**
 * 一个类可以实现多个接口,多个接口之间以逗号分隔
 * 实现了多个接口之后,必须重写这些接口中所有的抽象方法
 */
class C implements A, B {

    @Override
    public void doSome() {
        System.out.println("C.doSome");
    }

    @Override
    public void doOther() {
        System.out.println("C.doOther");
    }

    @Override
    public void login() {
        System.out.println("我重写了登陆方法");
    }
}

interface D extends A, B {

}